#ifndef TCP_IP_AT_H
#define TCP_IP_AT_H

#include "wifi_includes.h"

#define WIFI_DATA_LENGTH 1024

// WIFI模块的的TCP/IP指令
#define WIFI_AT_CIPSTATUS "AT+CIPSTATUS\r\n"           // 获取当前连接状态
#define WIFI_AT_CIPDOMAIN "AT+CIPDOMAIN="              // 域名解析功能
#define WIFI_AT_CIPSTART "AT+CIPSTART="                // 建立TCP/UDP/SSL连接
#define WIFI_AT_CIPSSLSIZE "AT+CIPSSLSIZE="            // 设置SSL缓冲区大小
#define WIFI_AT_CIPSSLCCONF "AT+CIPSSLCCONF"           // 配置ESP SSL client
#define WIFI_AT_CIPSEND "AT+CIPSEND"                   // 发送数据
#define WIFI_AT_CIPSENDEX "AT+CIPSENDEX="              // 发送数据，达到设置⻓长度，或者遇到字符\0，则发送数据
#define WIFI_AT_CIPSENDBUF "AT+CIPSENDBUF="            // 数据写⼊TCP发包缓存
#define WIFI_AT_CIPBUFRESET "AT+CIPBUFRESET"           // 重置TCP发包缓存
#define WIFI_AT_CIPBUFSTATUS "AT+CIPBUFSTATUS"         // 获取TCP发包缓存状态
#define WIFI_AT_CIPCHECKSEQ "AT+CIPCHECKSEQ="          // 查询写⼊入 TCP 发包缓存的某包是否成功发送
#define WIFI_AT_CIPCLOSEMODE "AT+CIPCLOSEMODE="        // 设置关闭TCP/UDP/SSL连接模式
#define WIFI_AT_CIPCLOSE "AT+CIPCLOSE"                 // 关闭TCP/UDP/SSL连接
#define WIFI_AT_CIFSR "AT+CIFSR\r\n"                   // 查询本地IP地址
#define WIFI_AT_CIPMUX "AT+CIPMUX"                     // 设置多连接模式
#define WIFI_AT_CIPSERVER "AT+CIPSERVER"               // 配置服务器模式
#define WIFI_AT_CIPSERVERMAXCONN "AT+CIPSERVERMAXCONN" // 设置服务器器允许建⽴立的最⼤大连接数
#define WIFI_AT_CIPMODE "AT+CIPMODE"                   // 设置透传模式
#define WIFI_AT_SAVETRANSLINK "AT+SAVETRANSLINK="      // 保存透传连接到 Flash
#define WIFI_AT_CIPSTO "AT+CIPSTO"                     // 设置ESP8266作为TCP服务器器时的超时时间
#define WIFI_AT_PING "AT+PING"                         // Ping功能
#define WIFI_AT_CIUPDATE "AT+CIUPDATE\r\n"             // 通过 Wi-Fi 升级软件
#define WIFI_AT_CIPDINFO "AT+CIPDINFO="                // 接收⽹网络数据时，+IPD 是否提示对端 IP 和端⼝
#define WIFI_AT_CIPRECVMODE "AT+CIPRECVMODE"           // 设置TCP接收模式
#define WIFI_AT_CIPRECVDATA "AT+CIPRECVDATA="          // TCP被动接收模式下，读取缓存的TCP数据
#define WIFI_AT_CIPRECVLEN "AT+CIPRECVLEN?\r\n"        // TCP 被动接收模式下，查询缓存TCP数据的长度
#define WIFI_AT_CIPSNTPCFG "AT+CIPSNTPCFG"             // 设置时域和SNTP服务器
#define WIFI_AT_CIPSNTPTIME "AT+CIPSNTPTIME?\r\n"      // 获取SNTP时间
#define WIFI_AT_CIPDNS_CUR "AT+CIPDNS_CUR"             // 自定义DNS服务器器，设置不保存到flash
#define WIFI_AT_CIPDNS_DEF "AT+CIPDNS_DEF"             // 自定义DNS服务器器，设置保存到flash

// 函数实现
void wifiAT_cipdomain(char *domain_name);
void wifiAT_cipstart(uint8_t cmdType, uint8_t cmdLinkNum, char *linkId, char *linkType, char *remoteIP,
                     char *remotePort, char *tcpKeepAlive, char *udpLocalPort, char *udpMode);
void wifiAT_CIPSSLSIZE(char *size);
void wifiAT_CIPSSLCCONF(int cmdType, char *sslMode);
void wifiAT_CIPSEND(int cmdType, int linkNum, int udpFlag, char *linkID, char *length, char *remoteIP, char *remotePort);
void wifiAT_CIPSENDEX(int linkNum, int udpFlag, char *linkID, char *length, char *remoteIP, char *remotePort);
void wifiAT_CIPSENDBUF(int linkNum, char *linkID, char *length);
void wifiAT_CIPBUFRESET(int linkNum, char *linkID);
void wifiAT_CIPBUFSTATUS(int linkNum, char *linkID);
void wifiAT_CIPCHECKSEQ(int linkNum, char *linkID, char *segmentID);
void wifiAT_CIPCLOSEMODE(int linkNum, char *linkID, char *enableAbort);
void wifiAT_CIPCLOSE(int linkNum, char *linkID);
void wifiAT_CIPMUX(int cmdType, char *mode);
void wifiAT_CIPSERVER(char *mode, char *port);
void wifiAT_CIPSERVERMAXCONN(int cmdType, char *num);
void wifiAT_CIPMODE(int cmdType, char *mode);
void wifiAT_SAVETRANSLINK(int cmdType, char *mode, char *remoteIP, char *remotePort, char *type,
                          char *localPort, char *keepAliveTime);
void wifiAT_CIPSTO(int cmdType, char *time);
void wifiAT_PING(char *ip);
void wifiAT_CIPDINFO(char *mode);
void wifiAT_IPD(int linkNum, char *len, char *remoteIP, char *remotePort, char *data);
void wifiAT_CIPRECVMODE(int cmdType, char *mode);
void wifiAT_CIPRECVDATA(int linkNum, char *link_id, char *len);
void wifiAT_CIPSNTPCFG(int cmdType, char *enable, char *timezone, char *server0, char *server1, char *server2);
void wifiAT_CIPDNS(int cmdType, int saveType, char *enable, char *server0, char *server1);

#endif